#ifndef FS_H
#define FS_H

#include <sys/stat.h>
#include "file.h"
#include "tools/list.h"
#include "ipc/mutex.h"
#include "fatfs/fatfs.h"
#include "applib/lib_syscall.h"

struct stat;
struct _fs_t;

//定义一种特定的文件系统所具有的操作
typedef struct _fs_op_t
{
    int (*mount)(struct _fs_t* fs,int major,int minor);
    void (*unmount)(struct _fs_t* fs);
    int (*open)(struct _fs_t* fs,const char* path,file_t* file);
    int (*read)(char* buf,int size,file_t* file);
    int (*write)(char* buf,int size,file_t* file);
    void (*close)(file_t* file);
    int (*seek)(file_t* file,u_int32_t offset,int dir);
    int (*stat)(file_t* file,struct stat* st);
    int (*ioctl)(file_t* file,int cmd,int arg0,int arg1);

    int (*opendir)(struct _fs_t* fs,const char* name,DIR* dir);
    int (*readdir)(struct _fs_t* fs,DIR* dir,struct dirent* dirent);
    int (*closedir)(struct _fs_t* fs,DIR* dir);
    int (*unlink)(struct _fs_t* fs,const char* path);
}fs_op_t;

#define FS_MOUNT_SIZE 512

//文件系统的类型
typedef enum _fs_type_t{
    FS_FAT16,
    FS_DEVFS,
}fs_type_t;

//文件系统的定义
typedef struct _fs_t
{
    char mount_point[FS_MOUNT_SIZE];   //名称
    fs_type_t type;     //类型
    
    fs_op_t* op;    //具有的操作
    void * data;    //可能会需要保存的数据
    int dev_id;     //设备id
    list_node_t node;  //系统中会存在多个文件系统,这里将文件系统做成链表
    mutex_t* mutex;       //文件系统可能被多个进程访问

    union
    {
        fat_t fat_data;
    };
}fs_t;


void fs_init();

int path_to_num(const char* path,int * num);
const char* path_next_child(const char* path);

int sys_open(const char* name,int flags,...);
int sys_read(int file,char* ptr,int len);
int sys_write(int file,char* ptr,int len);
int sys_lseek(int file,int ptr,int dir);
int sys_close(int file);
int sys_ioctl(int file,int cmd,int arg0,int arg1);
int sys_unlink(const char* path);

int sys_isatty(int file);
int sys_fstat(int file,struct stat * st);

int sys_dup(int file); 

int sys_opendir(const char* path, DIR* dir);
int sys_readdir(DIR* dir,struct dirent* dirent);
int sys_closedir(DIR* dir);

#endif